home *** CD-ROM | disk | FTP | other *** search
/ Computer Inter@ctive 16 / Computer Interactive cdrom 16 - dic 98.iso / zdnetit / content / CLASSBLD.ZIP / Include / CB_Multi.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-03-06  |  16.2 KB  |  542 lines

  1. #ifndef CB_MULTI_H
  2. #define CB_MULTI_H
  3.  
  4. #include <assert.h>
  5.  
  6. #include "CB_IteratorMulti.h"
  7.  
  8. // defines for include files
  9. #define RELATION_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  10. public:\
  11.     ClassTo* _first##NameTo;\
  12.     ClassTo* _last##NameTo;\
  13.     int _count##NameTo;\
  14. \
  15. public:\
  16.     void Add##NameTo##First(ClassTo* item);\
  17.     void Add##NameTo##Last(ClassTo* item);\
  18.     void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  19.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  20.     void Remove##NameTo(ClassTo* item);\
  21.     void RemoveAll##NameTo();\
  22.     void DeleteAll##NameTo();\
  23.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  24.     ClassTo* GetFirst##NameTo();\
  25.     ClassTo* GetLast##NameTo();\
  26.     ClassTo* GetNext##NameTo(ClassTo* pos);\
  27.     ClassTo* GetPrev##NameTo(ClassTo* pos);\
  28.     int Get##NameTo##Count();\
  29.     void Move##NameTo##First(ClassTo* item);\
  30.     void Move##NameTo##Last(ClassTo* item);\
  31.     void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  32.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  33.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  34.     ITERATOR_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  35.  
  36. #define RELATION_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  37. public:\
  38.     ClassTo* _first##NameTo;\
  39.     ClassTo* _last##NameTo;\
  40.     int _count##NameTo;\
  41. \
  42. public:\
  43.     void Add##NameTo##First(ClassTo* item);\
  44.     void Add##NameTo##Last(ClassTo* item);\
  45.     void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  46.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  47.     void Remove##NameTo(ClassTo* item);\
  48.     void RemoveAll##NameTo();\
  49.     void DeleteAll##NameTo();\
  50.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  51.     ClassTo* GetFirst##NameTo();\
  52.     ClassTo* GetLast##NameTo();\
  53.     ClassTo* GetNext##NameTo(ClassTo* pos);\
  54.     ClassTo* GetPrev##NameTo(ClassTo* pos);\
  55.     int Get##NameTo##Count();\
  56.     void Move##NameTo##First(ClassTo* item);\
  57.     void Move##NameTo##Last(ClassTo* item);\
  58.     void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  59.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  60.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  61.     ITERATOR_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  62.  
  63. #define RELATION_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  64. public:\
  65.     ClassFrom* _ref##NameFrom;\
  66.     ClassTo* _prev##NameFrom;\
  67.     ClassTo* _next##NameFrom;\
  68. \
  69. public:\
  70.     ClassFrom* Get##NameFrom() { return _ref##NameFrom; };
  71.  
  72. // defines implementation
  73. #define INIT_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  74.     _first##NameTo = (ClassTo*)0;\
  75.     _last##NameTo = (ClassTo*)0;\
  76.     _count##NameTo = 0;
  77.  
  78. #define EXIT_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  79.     { for (ClassTo* item = GetFirst##NameTo(); item; item = GetFirst##NameTo())\
  80.           Remove##NameTo(item); }
  81.  
  82. #define REPLACE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  83.     _first##NameTo = pOld->_first##NameTo;\
  84.     _last##NameTo = pOld->_last##NameTo;\
  85.     _count##NameTo = pOld->_count##NameTo;\
  86.     pOld->_first##NameTo = (ClassTo*)0;\
  87.     pOld->_last##NameTo = (ClassTo*)0;\
  88.     { for (ClassTo* item = GetFirst##NameTo(); item; item = GetNext##NameTo(item))\
  89.           item->_ref##NameFrom = this; }
  90.  
  91. #define INIT_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  92.     _ref##NameFrom = (ClassFrom*)0;\
  93.     _prev##NameFrom = (ClassTo*)0;\
  94.     _next##NameFrom = (ClassTo*)0;
  95.  
  96. #define EXIT_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  97.     assert(this);\
  98.     if (_ref##NameFrom)\
  99.     {\
  100.         ClassFrom##::##NameTo##Iterator::Check(this);\
  101. \
  102.         _ref##NameFrom->_count##NameTo--;\
  103. \
  104.         if (_next##NameFrom)\
  105.             _next##NameFrom->_prev##NameFrom = _prev##NameFrom;\
  106.         else\
  107.             _ref##NameFrom->_last##NameTo = _prev##NameFrom;\
  108. \
  109.         if (_prev##NameFrom)\
  110.             _prev##NameFrom->_next##NameFrom = _next##NameFrom;\
  111.         else\
  112.             _ref##NameFrom->_first##NameTo = _next##NameFrom;\
  113. \
  114.         _prev##NameFrom = (ClassTo*)0;\
  115.         _next##NameFrom = (ClassTo*)0;\
  116.         _ref##NameFrom = (ClassFrom*)0;\
  117.     }
  118.  
  119. #define REPLACE_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  120.     assert(this);\
  121.     assert(pOld);\
  122.     if (pOld->_ref##NameFrom)\
  123.     {\
  124.         ClassFrom##::##NameTo##Iterator::Check(pOld, this);\
  125. \
  126.         _ref##NameFrom = pOld->_ref##NameFrom;\
  127. \
  128.         if (pOld->_next##NameFrom)\
  129.             pOld->_next##NameFrom->_prev##NameFrom = this;\
  130.         else\
  131.             _ref##NameFrom->_last##NameTo = this;\
  132. \
  133.         if (pOld->_prev##NameFrom)\
  134.             pOld->_prev##NameFrom->_next##NameFrom = this;\
  135.         else\
  136.             _ref##NameFrom->_first##NameTo = this;\
  137. \
  138.         _next##NameFrom = pOld->_next##NameFrom;\
  139.         _prev##NameFrom = pOld->_prev##NameFrom;\
  140. \
  141.         pOld->_ref##NameFrom = (ClassFrom*)0;\
  142.         pOld->_next##NameFrom = (ClassTo*)0;\
  143.         pOld->_prev##NameFrom = (ClassTo*)0;\
  144.     }\
  145.     else\
  146.     {\
  147.         _ref##NameFrom = (ClassFrom*)0;\
  148.         _prev##NameFrom = (ClassTo*)0;\
  149.         _next##NameFrom = (ClassTo*)0;\
  150.     }
  151.  
  152. #define METHODS_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  153. void ClassFrom##::Add##NameTo##First(ClassTo* item)\
  154. {\
  155.     METHOD_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  156. }\
  157. \
  158. void ClassFrom##::Add##NameTo##Last(ClassTo* item)\
  159. {\
  160.     METHOD_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  161. }\
  162. \
  163. void ClassFrom##::Add##NameTo##After(ClassTo* item, ClassTo* pos)\
  164. {\
  165.     METHOD_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  166. }\
  167. \
  168. void ClassFrom##::Add##NameTo##Before(ClassTo* item, ClassTo* pos)\
  169. {\
  170.     METHOD_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  171. }\
  172. \
  173. void ClassFrom##::Remove##NameTo(ClassTo* item)\
  174. {\
  175.     METHOD_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  176. }\
  177. \
  178. void ClassFrom##::RemoveAll##NameTo()\
  179. {\
  180.     METHOD_MULTI_REMOVEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  181. }\
  182. \
  183. void ClassFrom##::DeleteAll##NameTo()\
  184. {\
  185.     METHOD_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  186. }\
  187. \
  188. void ClassFrom##::Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  189. {\
  190.     METHOD_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  191. }\
  192. \
  193. ClassTo* ClassFrom##::GetFirst##NameTo()\
  194. {\
  195.     METHOD_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  196. }\
  197. \
  198. ClassTo* ClassFrom##::GetLast##NameTo()\
  199. {\
  200.     METHOD_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  201. }\
  202. \
  203. ClassTo* ClassFrom##::GetNext##NameTo(ClassTo* pos)\
  204. {\
  205.     METHOD_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  206. }\
  207. \
  208. ClassTo* ClassFrom##::GetPrev##NameTo(ClassTo* pos)\
  209. {\
  210.     METHOD_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  211. }\
  212. \
  213. int ClassFrom##::Get##NameTo##Count()\
  214. {\
  215.     METHOD_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  216. }\
  217. \
  218. void ClassFrom##::Move##NameTo##First(ClassTo* item)\
  219. {\
  220.     METHOD_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  221. }\
  222. \
  223. void ClassFrom##::Move##NameTo##Last(ClassTo* item)\
  224. {\
  225.     METHOD_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  226. }\
  227. \
  228. void ClassFrom##::Move##NameTo##After(ClassTo* item, ClassTo* pos)\
  229. {\
  230.     METHOD_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  231. }\
  232. \
  233. void ClassFrom##::Move##NameTo##Before(ClassTo* item, ClassTo* pos)\
  234. {\
  235.     METHOD_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  236. }\
  237. \
  238. void ClassFrom##::Sort##NameTo##(int (*comp)(ClassTo*, ClassTo*))\
  239. {\
  240.     METHOD_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  241. }
  242.  
  243. #define METHOD_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  244.     assert(this);\
  245. \
  246.     assert(item);\
  247.     assert(item->_ref##NameFrom == (ClassFrom*)0);\
  248. \
  249.     _count##NameTo++;\
  250. \
  251.     item->_ref##NameFrom = this;\
  252. \
  253.     if (_first##NameTo)\
  254.     {\
  255.         _first##NameTo->_prev##NameFrom = item;\
  256.         item->_next##NameFrom = _first##NameTo;\
  257.         _first##NameTo = item;\
  258.     }\
  259.     else\
  260.         _first##NameTo = _last##NameTo = item;
  261.  
  262. #define METHOD_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  263.     assert(this);\
  264. \
  265.     assert(item);\
  266.     assert(item->_ref##NameFrom == (ClassFrom*)0);\
  267. \
  268.     _count##NameTo++;\
  269. \
  270.     item->_ref##NameFrom = this;\
  271. \
  272.     if (_last##NameTo)\
  273.     {\
  274.         _last##NameTo->_next##NameFrom = item;\
  275.         item->_prev##NameFrom = _last##NameTo;\
  276.         _last##NameTo = item;\
  277.     }\
  278.     else\
  279.         _first##NameTo = _last##NameTo = item;
  280.  
  281. #define METHOD_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  282.     assert(this);\
  283. \
  284.     assert(item);\
  285.     assert(item->_ref##NameFrom == (ClassFrom*)0);\
  286. \
  287.     assert(pos);\
  288.     assert(pos->_ref##NameFrom == this);\
  289. \
  290.     _count##NameTo++;\
  291. \
  292.     item->_ref##NameFrom = this;\
  293.     item->_prev##NameFrom = pos;\
  294.     item->_next##NameFrom = pos->_next##NameFrom;\
  295.     pos->_next##NameFrom  = item;\
  296. \
  297.     if (item->_next##NameFrom)\
  298.         item->_next##NameFrom->_prev##NameFrom = item;\
  299.     else\
  300.         _last##NameTo = item;
  301.  
  302. #define METHOD_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  303.     assert(this);\
  304. \
  305.     assert(item);\
  306.     assert(item->_ref##NameFrom == (ClassFrom*)0);\
  307. \
  308.     assert(pos);\
  309.     assert(pos->_ref##NameFrom == this);\
  310. \
  311.     _count##NameTo++;\
  312. \
  313.     item->_ref##NameFrom = this;\
  314.     item->_next##NameFrom = pos;\
  315.     item->_prev##NameFrom = pos->_prev##NameFrom;\
  316.     pos->_prev##NameFrom  = item;\
  317. \
  318.     if (item->_prev##NameFrom)\
  319.         item->_prev##NameFrom->_next##NameFrom = item;\
  320.     else\
  321.         _first##NameTo = item;
  322.  
  323. #define METHOD_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  324.     assert(this);\
  325. \
  326.     assert(item);\
  327.     assert(item->_ref##NameFrom == this);\
  328. \
  329.     ClassFrom##::##NameTo##Iterator::Check(item);\
  330. \
  331.     _count##NameTo--;\
  332. \
  333.     if (item->_next##NameFrom)\
  334.         item->_next##NameFrom->_prev##NameFrom = item->_prev##NameFrom;\
  335.     else\
  336.         _last##NameTo = item->_prev##NameFrom;\
  337. \
  338.     if (item->_prev##NameFrom)\
  339.         item->_prev##NameFrom->_next##NameFrom = item->_next##NameFrom;\
  340.     else\
  341.         _first##NameTo = item->_next##NameFrom;\
  342. \
  343.     item->_prev##NameFrom = (ClassTo*)0;\
  344.     item->_next##NameFrom = (ClassTo*)0;\
  345.     item->_ref##NameFrom = (ClassFrom*)0;
  346.  
  347. #define METHOD_MULTI_REMOVEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  348.     assert(this);\
  349. \
  350.     for (ClassTo* item = GetFirst##NameTo(); item; item = GetFirst##NameTo())\
  351.           Remove##NameTo(item);
  352.  
  353. #define METHOD_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  354.     assert(this);\
  355. \
  356.     for (ClassTo* item = GetFirst##NameTo(); item; item = GetFirst##NameTo())\
  357.           delete item;
  358.  
  359. #define METHOD_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  360.     assert(this);\
  361. \
  362.     assert(item);\
  363.     assert(item->_ref##NameFrom == this);\
  364. \
  365.     assert(newItem);\
  366.     assert(newItem->_ref##NameFrom == (ClassFrom*)0);\
  367. \
  368.     ClassFrom##::##NameTo##Iterator::Check(item, newItem);\
  369. \
  370.     if (item->_next##NameFrom)\
  371.         item->_next##NameFrom->_prev##NameFrom = newItem;\
  372.     else\
  373.         _last##NameTo = newItem;\
  374. \
  375.     if (item->_prev##NameFrom)\
  376.         item->_prev##NameFrom->_next##NameFrom = newItem;\
  377.     else\
  378.         _first##NameTo = newItem;\
  379. \
  380.     newItem->_next##NameFrom = item->_next##NameFrom;\
  381.     newItem->_prev##NameFrom = item->_prev##NameFrom;\
  382.     item->_next##NameFrom = (ClassTo*)0;\
  383.     item->_prev##NameFrom = (ClassTo*)0;\
  384. \
  385.     item->_ref##NameFrom = (ClassFrom*)0;\
  386.     newItem->_ref##NameFrom = this;
  387.  
  388. #define METHOD_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  389.     assert(this);\
  390.     return _first##NameTo;
  391.  
  392. #define METHOD_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  393.     assert(this);\
  394.     return _last##NameTo;
  395.  
  396. #define METHOD_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  397.     assert(this);\
  398. \
  399.     if (pos == (ClassTo*)0)\
  400.         return _first##NameTo;\
  401. \
  402.     assert(pos);\
  403.     assert(pos->_ref##NameFrom == this);\
  404. \
  405.     return pos->_next##NameFrom;
  406.  
  407. #define METHOD_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  408.     assert(this);\
  409. \
  410.     if (pos == (ClassTo*)0)\
  411.         return _last##NameTo;\
  412. \
  413.     assert(pos);\
  414.     assert(pos->_ref##NameFrom == this);\
  415. \
  416.     return pos->_prev##NameFrom;
  417.  
  418. #define METHOD_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  419.     assert(this);\
  420.     return _count##NameTo;
  421.  
  422. #define METHOD_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  423.     assert(item);\
  424.     assert(item->_ref##NameFrom);\
  425.     item->_ref##NameFrom->Remove##NameTo(item);\
  426.     Add##NameTo##First(item);
  427.  
  428. #define METHOD_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  429.     assert(item);\
  430.     assert(item->_ref##NameFrom);\
  431.     item->_ref##NameFrom->Remove##NameTo(item);\
  432.     Add##NameTo##Last(item);
  433.  
  434. #define METHOD_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  435.     assert(item);\
  436.     assert(item->_ref##NameFrom);\
  437.     item->_ref##NameFrom->Remove##NameTo(item);\
  438.     Add##NameTo##After(item, pos);
  439.  
  440. #define METHOD_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  441.     assert(item);\
  442.     assert(item->_ref##NameFrom);\
  443.     item->_ref##NameFrom->Remove##NameTo(item);\
  444.     Add##NameTo##Before(item, pos);
  445.  
  446. #define METHOD_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  447.     for (ClassTo* a = GetFirst##NameTo(); a; a = GetNext##NameTo(a))\
  448.     {\
  449.         ClassTo* b = GetNext##NameTo(a);\
  450. \
  451.         while (b && (comp(a, b) > 0))\
  452.         {\
  453.             Remove##NameTo(b);\
  454.             ClassTo* c = GetPrev##NameTo(a);\
  455.             while (c && (comp(c, b) > 0))\
  456.                 c = GetPrev##NameTo(c);\
  457. \
  458.             if (c)\
  459.                 Add##NameTo##After(b, c);\
  460.             else\
  461.                 Add##NameTo##First(b);\
  462. \
  463.             b = GetNext##NameTo(a);\
  464.         }\
  465.     }
  466.  
  467. #define METHODS_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  468.  
  469. #define SERIALIZE_ALL_OBJECTS(Document, DocumentName, DocumentBase, DocumentBaseName) \
  470.     if (rCArchive.IsStoring())\
  471.     {\
  472.         /* Write the number of objects to store.*/\
  473.         rCArchive << Get##DocumentBaseName##Count();\
  474. \
  475.         /* Reserve index = 0; for the NULL pointer*/\
  476.         int index = 1;\
  477. \
  478.         /* Write the data of the objects*/\
  479.         DocumentBase* object;\
  480.         for (object = GetFirst##DocumentBaseName(); object; object = GetNext##DocumentBaseName(object))\
  481.         {\
  482.             object->_index = index++;\
  483.             rCArchive << object;\
  484.         }\
  485. \
  486.         /* Write relations of Document*/\
  487.         SerializeRelations(rCArchive, NULL);\
  488. \
  489.         /* Write all other objects relations*/\
  490.         for (object = GetFirst##DocumentBaseName(); object; object = GetNext##DocumentBaseName(object))\
  491.         {\
  492.             object->SerializeRelations(rCArchive, NULL);\
  493.         }\
  494.    }\
  495.    else\
  496.    {\
  497.         /* Read the number of objects stored*/\
  498.         int objectCount;\
  499.         rCArchive >> objectCount;\
  500. \
  501.         /* Make an array for the pointer mapping*/\
  502.         DocumentBase** pointerArray = new DocumentBase*[objectCount+1];\
  503.         pointerArray[0] = NULL;\
  504. \
  505.         /* Read the data of the objects*/\
  506.         for (int index = 1; index <= objectCount; index++)\
  507.         {\
  508.             CObject* pCObject;\
  509.             rCArchive >> pCObject;\
  510.             pointerArray[index] = (DocumentBase*)pCObject;\
  511.         }\
  512. \
  513.         /* Read relations of Document*/\
  514.         SerializeRelations(rCArchive, pointerArray);\
  515. \
  516.         /* Read all other objects relations*/\
  517.         for (index = 1; index <= objectCount; index++)\
  518.             pointerArray[index]->SerializeRelations(rCArchive, pointerArray);\
  519. \
  520.         delete pointerArray;\
  521.     }
  522.  
  523. #define WRITE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  524.     rCArchive << Get##NameTo##Count();\
  525.     { for (ClassTo* item = GetFirst##NameTo(); item; item = GetNext##NameTo(item))\
  526.           rCArchive << item->_index; }
  527.  
  528. #define READ_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  529.     {\
  530.         int count;\
  531.         int index;\
  532. \
  533.         rCArchive >> count;\
  534.         for (int i = 0; i < count; i++)\
  535.         {\
  536.             rCArchive >> index;\
  537.             Add##NameTo##Last((ClassTo*)(pointerArray[index]));\
  538.         }\
  539.     }
  540.  
  541. #endif
  542.